Today you can choose from three options, representing different
approaches to mapping:
Map some data using Palladio
Make a ‘StoryMap’
Work with the Open Street Map (involves some coding)
For 3, you’ll need to open a coding notebook. Bear in mind that these
can be a bit temperamental, so be prepared to be patient or for it not
to work at all. If you don’t have coding experience, it might be nice to
try out to get a feel for it, but making any changes or adding your own
data may be slightly frustrating.
Map Using Palladio
In this method, we’ll use a tool called Palladio, which was
specifically made to work with humanities data. There are a number of
very good tutorials for using Palladio, particularly https://miriamposner.com/blog/getting-started-with-palladio/.
First, go to http://hdlab.stanford.edu/palladio/ and click ‘start’.
This is where you can load your own data in .csv format.
You can use any .csv data. To make a map, the application
needs data with a single column with the latitude and longitude
coordinates, separated by a comma.
Load some sample data I have prepared here: https://docs.google.com/spreadsheets/d/17_enwtCIHfqrTyUhV-WnAEqKiYevEkU6-NW0mlE0Er0/edit?usp=sharing
This contains 1,000 individuals tagged as ‘composer’ in Wikipedia.
This data is relatively simple to get from a service called Wikidata -
if you think you’d like to use some kind of geographic data like
this in your portfolio, get in touch with me!
Click ‘start’ on Palladio, and copy this data into the large text box
on the next screen:

Click ‘load’.
Click on the map tab at the top of the screen:
Next, create a ‘layer’, which will allow us to draw points of data on
top of the map. Click ‘new layer’ and give it a name:
Next, tell Palladio which data to use to draw points on the map.
Click on the ‘Places’ box which will give a drop-down of all the fields
in the data with geographic coordinates. Click on the first one,
‘coordinates’.
We also want the name of the individual to appear when you hover over
the point. To do this, change the ‘Tooltip’ option to ‘itemLabel’.
Experiment with changing the point colour, and choosing to size by
something in your data.
Click ‘Add layer’ to create the points on your map. You’ve just
created a basic interactive map, congratulations! You can move the map
around by clicking and dragging, and hovering over a point will display
the relevant data.

Add a map layer
As an optional step, you can change or add different background maps
to your Palladio map, for example one containing modern roads and
cities, or a historic map.
To do this, click on ‘New Layer’ again. This time, click on the
‘Tiles’ tab. You can select an existing tileset here, or add your own
using the ‘Custom tiles’ option.
To add custom tiles, you need the appropriate ‘Tileset URL’. One
place to find these is a resource called David Rumsey Maps. Go
to https://rumsey.mapranksearch.com/, and find a map you
are interested in on the right hand side. Click into the map, and then
on the thumbnail of it on the bottom-right of the screen. Click ‘This
map’ on the next screen:

Finally, you’ll need to make a free account on David Rumsey maps, or
log in through Google. Once this is done you’ll see three text boxes.
Copy and paste the text from the final one (XYZ link), and paste this
into the ‘Titleset URL’ box on Palladio, and click ‘add layer’:


Once you are finished, take a screenshot of your map, write a 200-300
word description, create a .pdf with the screenshot and description, and
upload to the assignment on Brightspace.
Make a StoryMap
The tool we’re going to use is called StoryMap JS. It’s quite
straightforward to use, so the challenge will be to find a story which
has a number of geographic locations related to it. You could choose an
event in history, a recent news event which took place in several
locations, or something else entirely.
To begin with, go to https://storymap.knightlab.com/ and click on ‘Make a
StoryMap’.

It will ask you to log in with a Google account - there’s no way
around this unfortunately.
Once logged in, create a new map.
Before you begin, check out the ‘options’ at the top of the page.
Most are self-explanatory, but one to note is ‘Treat as:’, which can be
either ‘image’ or ‘cartography’. For our purposes, the only difference
is that with ‘image’ selected, there will not be a line drawn between
points on the map.
The starting slide is a special slide which will show all the points
from your subsequent slides. Add a headline and text, or an image which
represents your map as a whole. Use ‘preview’ at the top of the map to
see what it will look like to the user.
Once you’re happy, add a new slide. Again, you can give it a name,
add text, or add an image or even a youtube video as a URL. Next, you
want to associate the slide with a geographic location. To do this, use
the text box at the bottom of the map. You can either add coordinates
directly (these can be found easily using Google maps, ask me if you’re
not sure), or you can search for a place. Search for a location, for
example ‘Paris’. Click on the correct one, making sure that you don’t
select another place with the same name. To add coordinates, enter in
the format as specified in the text box.
Continue until you have finished with your slides, and check how it
looks using the Preview.
Make sure to save your work, and when you’re finished, click ‘share’.
Copy the URL into a .pdf, along with a short description of your map and
the motivation behind it, and upload to the relevant area on
Brightspace.
Create a map using the programming language R.
For this, you need to run a coding notebook through a service called
MyBinder. To load the notebook, click the button below:

Once this loads (it might take a few minutes), you’ll see a coding
notebook. Be prepared to have one of the other tutorials as plan B, as
sometimes this service doesn’t work!
Another important thing to note is that Binder doesn’t save your data
- in fact, if it is idle for ten minutes, it will be deleted. So if you
make lots of changes or if you want to download your output, make sure
you do so as soon as possible.
After a wait, you’ll be greeted with a new interface. To open the
code notebook we’re going to use, look at the file lists on the
bottom-right of the screen, and click on the file ’draw_osm_map.Rmd.

The notebook is divided into ‘cells’. Each cell contains some code.
Run the cell by clicking the small triangle on the top right. The code
will run and the results (if any) will display underneath the cell.
The first cell loads some libraries (packages of code) needed.
The next cell downloads data from Open Street Map. Open street map
contains thousands of types of data, from roads and rivers to amenities
such as bars and restaurants. You can use a coding language to access
this and draw a map.
Here I have downloaded all places marked as a pub within the centre
of Leiden. To do so, first we specify a ‘bounding box’, which tells the
code to only download data from within a certain area on the map. Next,
we specify what type of data, first general (‘amenity’) and then
specific (‘pub’). Then do the same to get residential streets, and
canals.
Next are a couple of tricks to get the actual geographic data (points
and lines), but it’s not worth going into the details.
Once you run this cell, it will download all the relevant data.
The final cell turns it into a simple map. We add each of the data
points as layers to the map. When you run the cell, you’ll see the map
underneath.
The fun thing is that now you can try swapping in different
data points to download, and even try with another city. For the former,
the full list is available here: https://wiki.openstreetmap.org/wiki/Map_features
To use another city, you’ll need to get the correct coordinates for
the box it is contained within. You can use a bounding box tool, and
then copy this into the first part of the command. Note that if
you choose a very big area, it might struggle to download the
data.
Once you have finished your map, save it using ‘right click-> save
image as’ in your browser. Copy into a .pdf, write a 200-300 word
description of your map and what it shows, and upload to the relevant
assignment on Brightspace.
LS0tCnRpdGxlOiAiTWFwcGluZyBIYW5kcy1vbiBzZXNzaW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUb2RheSB5b3UgY2FuIGNob29zZSBmcm9tIHRocmVlIG9wdGlvbnMsIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBtYXBwaW5nOgoKMS4gIE1hcCBzb21lIGRhdGEgdXNpbmcgUGFsbGFkaW8KCjIuICBNYWtlIGEgJ1N0b3J5TWFwJwoKMy4gIFdvcmsgd2l0aCB0aGUgT3BlbiBTdHJlZXQgTWFwIChpbnZvbHZlcyBzb21lIGNvZGluZykKCkZvciAzLCB5b3UnbGwgbmVlZCB0byBvcGVuIGEgY29kaW5nIG5vdGVib29rLiBCZWFyIGluIG1pbmQgdGhhdCB0aGVzZSBjYW4gYmUgYSBiaXQgdGVtcGVyYW1lbnRhbCwgc28gYmUgcHJlcGFyZWQgdG8gYmUgcGF0aWVudCBvciBmb3IgaXQgbm90IHRvIHdvcmsgYXQgYWxsLiBJZiB5b3UgZG9uJ3QgaGF2ZSBjb2RpbmcgZXhwZXJpZW5jZSwgaXQgbWlnaHQgYmUgbmljZSB0byB0cnkgb3V0IHRvIGdldCBhIGZlZWwgZm9yIGl0LCBidXQgbWFraW5nIGFueSBjaGFuZ2VzIG9yIGFkZGluZyB5b3VyIG93biBkYXRhIG1heSBiZSBzbGlnaHRseSBmcnVzdHJhdGluZy4KCiMjIE1hcCBVc2luZyBQYWxsYWRpbwoKSW4gdGhpcyBtZXRob2QsIHdlJ2xsIHVzZSBhIHRvb2wgY2FsbGVkIFBhbGxhZGlvLCB3aGljaCB3YXMgc3BlY2lmaWNhbGx5IG1hZGUgdG8gd29yayB3aXRoIGh1bWFuaXRpZXMgZGF0YS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZlcnkgZ29vZCB0dXRvcmlhbHMgZm9yIHVzaW5nIFBhbGxhZGlvLCBwYXJ0aWN1bGFybHkgPGh0dHBzOi8vbWlyaWFtcG9zbmVyLmNvbS9ibG9nL2dldHRpbmctc3RhcnRlZC13aXRoLXBhbGxhZGlvLz4uCgpGaXJzdCwgZ28gdG8gPGh0dHA6Ly9oZGxhYi5zdGFuZm9yZC5lZHUvcGFsbGFkaW8vPiBhbmQgY2xpY2sgJ3N0YXJ0Jy4gVGhpcyBpcyB3aGVyZSB5b3UgY2FuIGxvYWQgeW91ciBvd24gZGF0YSBpbiAuY3N2IGZvcm1hdC4KCllvdSBjYW4gdXNlIGFueSAuY3N2IGRhdGEuICoqVG8gbWFrZSBhIG1hcCwgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGRhdGEgd2l0aCBhIHNpbmdsZSBjb2x1bW4gd2l0aCB0aGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBjb29yZGluYXRlcywgc2VwYXJhdGVkIGJ5IGEgY29tbWEuKioKCkxvYWQgc29tZSBzYW1wbGUgZGF0YSBJIGhhdmUgcHJlcGFyZWQgaGVyZTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTdfZW53dENJSGZxclR5VWhWLVduQUVxS2lZZXZFa1U2LU5XMG1sRTBFcjAvZWRpdD91c3A9c2hhcmluZwoKVGhpcyBjb250YWlucyAxLDAwMCBpbmRpdmlkdWFscyB0YWdnZWQgYXMgJ2NvbXBvc2VyJyBpbiBXaWtpcGVkaWEuIFRoaXMgZGF0YSBpcyByZWxhdGl2ZWx5IHNpbXBsZSB0byBnZXQgZnJvbSBhIHNlcnZpY2UgY2FsbGVkIFdpa2lkYXRhIC0gKippZiB5b3UgdGhpbmsgeW91J2QgbGlrZSB0byB1c2Ugc29tZSBraW5kIG9mIGdlb2dyYXBoaWMgZGF0YSBsaWtlIHRoaXMgaW4geW91ciBwb3J0Zm9saW8sIGdldCBpbiB0b3VjaCB3aXRoIG1lISoqCgpDbGljayAnc3RhcnQnIG9uIFBhbGxhZGlvLCBhbmQgY29weSB0aGlzIGRhdGEgaW50byB0aGUgbGFyZ2UgdGV4dCBib3ggb24gdGhlIG5leHQgc2NyZWVuOgoKIVtdKGltYWdlcy9wYXN0ZS1CQkZCNjFEQi5wbmcpCgpDbGljayAnbG9hZCcuCgpDbGljayBvbiB0aGUgbWFwIHRhYiBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW46CgpOZXh0LCBjcmVhdGUgYSAnbGF5ZXInLCB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGRyYXcgcG9pbnRzIG9mIGRhdGEgb24gdG9wIG9mIHRoZSBtYXAuIENsaWNrICduZXcgbGF5ZXInIGFuZCBnaXZlIGl0IGEgbmFtZToKCk5leHQsIHRlbGwgUGFsbGFkaW8gd2hpY2ggZGF0YSB0byB1c2UgdG8gZHJhdyBwb2ludHMgb24gdGhlIG1hcC4gQ2xpY2sgb24gdGhlICdQbGFjZXMnIGJveCB3aGljaCB3aWxsIGdpdmUgYSBkcm9wLWRvd24gb2YgYWxsIHRoZSBmaWVsZHMgaW4gdGhlIGRhdGEgd2l0aCBnZW9ncmFwaGljIGNvb3JkaW5hdGVzLiBDbGljayBvbiB0aGUgZmlyc3Qgb25lLCAnY29vcmRpbmF0ZXMnLgoKV2UgYWxzbyB3YW50IHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHRvIGFwcGVhciB3aGVuIHlvdSBob3ZlciBvdmVyIHRoZSBwb2ludC4gVG8gZG8gdGhpcywgY2hhbmdlIHRoZSAnVG9vbHRpcCcgb3B0aW9uIHRvICdpdGVtTGFiZWwnLgoKRXhwZXJpbWVudCB3aXRoIGNoYW5naW5nIHRoZSBwb2ludCBjb2xvdXIsIGFuZCBjaG9vc2luZyB0byBzaXplIGJ5IHNvbWV0aGluZyBpbiB5b3VyIGRhdGEuCgpDbGljayAnQWRkIGxheWVyJyB0byBjcmVhdGUgdGhlIHBvaW50cyBvbiB5b3VyIG1hcC4gWW91J3ZlIGp1c3QgY3JlYXRlZCBhIGJhc2ljIGludGVyYWN0aXZlIG1hcCwgY29uZ3JhdHVsYXRpb25zISBZb3UgY2FuIG1vdmUgdGhlIG1hcCBhcm91bmQgYnkgY2xpY2tpbmcgYW5kIGRyYWdnaW5nLCBhbmQgaG92ZXJpbmcgb3ZlciBhIHBvaW50IHdpbGwgZGlzcGxheSB0aGUgcmVsZXZhbnQgZGF0YS4KCiFbXShpbWFnZXMvcGFzdGUtMUVCNTEwQ0UucG5nKQoKIyMgQWRkIGEgbWFwIGxheWVyCgpBcyBhbiBvcHRpb25hbCBzdGVwLCB5b3UgY2FuIGNoYW5nZSBvciBhZGQgZGlmZmVyZW50IGJhY2tncm91bmQgbWFwcyB0byB5b3VyIFBhbGxhZGlvIG1hcCwgZm9yIGV4YW1wbGUgb25lIGNvbnRhaW5pbmcgbW9kZXJuIHJvYWRzIGFuZCBjaXRpZXMsIG9yIGEgaGlzdG9yaWMgbWFwLgoKVG8gZG8gdGhpcywgY2xpY2sgb24gJ05ldyBMYXllcicgYWdhaW4uIFRoaXMgdGltZSwgY2xpY2sgb24gdGhlICdUaWxlcycgdGFiLiBZb3UgY2FuIHNlbGVjdCBhbiBleGlzdGluZyB0aWxlc2V0IGhlcmUsIG9yIGFkZCB5b3VyIG93biB1c2luZyB0aGUgJ0N1c3RvbSB0aWxlcycgb3B0aW9uLgoKVG8gYWRkIGN1c3RvbSB0aWxlcywgeW91IG5lZWQgdGhlIGFwcHJvcHJpYXRlICdUaWxlc2V0IFVSTCcuIE9uZSBwbGFjZSB0byBmaW5kIHRoZXNlIGlzIGEgcmVzb3VyY2UgY2FsbGVkICpEYXZpZCBSdW1zZXkgTWFwcyouIEdvIHRvIGh0dHBzOi8vcnVtc2V5Lm1hcHJhbmtzZWFyY2guY29tLywgYW5kIGZpbmQgYSBtYXAgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuIENsaWNrIGludG8gdGhlIG1hcCwgYW5kIHRoZW4gb24gdGhlIHRodW1ibmFpbCBvZiBpdCBvbiB0aGUgYm90dG9tLXJpZ2h0IG9mIHRoZSBzY3JlZW4uIENsaWNrICdUaGlzIG1hcCcgb24gdGhlIG5leHQgc2NyZWVuOgoKIVtdKGltYWdlcy9wYXN0ZS1DRkQ1NzlCQy5wbmcpCgpGaW5hbGx5LCB5b3UnbGwgbmVlZCB0byBtYWtlIGEgZnJlZSBhY2NvdW50IG9uIERhdmlkIFJ1bXNleSBtYXBzLCBvciBsb2cgaW4gdGhyb3VnaCBHb29nbGUuIE9uY2UgdGhpcyBpcyBkb25lIHlvdSdsbCBzZWUgdGhyZWUgdGV4dCBib3hlcy4gQ29weSBhbmQgcGFzdGUgdGhlIHRleHQgZnJvbSB0aGUgZmluYWwgb25lIChYWVogbGluayksIGFuZCBwYXN0ZSB0aGlzIGludG8gdGhlICdUaXRsZXNldCBVUkwnIGJveCBvbiBQYWxsYWRpbywgYW5kIGNsaWNrICdhZGQgbGF5ZXInOgoKIVtdKGltYWdlcy9wYXN0ZS0wNUFDRjg3QS5wbmcpCgohW10oaW1hZ2VzL3Bhc3RlLTdEOTFFNTIzLnBuZykKCk9uY2UgeW91IGFyZSBmaW5pc2hlZCwgdGFrZSBhIHNjcmVlbnNob3Qgb2YgeW91ciBtYXAsIHdyaXRlIGEgMjAwLTMwMCB3b3JkIGRlc2NyaXB0aW9uLCBjcmVhdGUgYSAucGRmIHdpdGggdGhlIHNjcmVlbnNob3QgYW5kIGRlc2NyaXB0aW9uLCBhbmQgdXBsb2FkIHRvIHRoZSBhc3NpZ25tZW50IG9uIEJyaWdodHNwYWNlLgoKIyMgTWFrZSBhIFN0b3J5TWFwCgpUaGUgdG9vbCB3ZSdyZSBnb2luZyB0byB1c2UgaXMgY2FsbGVkIFN0b3J5TWFwIEpTLiBJdCdzIHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZCB0byB1c2UsIHNvIHRoZSBjaGFsbGVuZ2Ugd2lsbCBiZSB0byBmaW5kIGEgc3Rvcnkgd2hpY2ggaGFzIGEgbnVtYmVyIG9mIGdlb2dyYXBoaWMgbG9jYXRpb25zIHJlbGF0ZWQgdG8gaXQuIFlvdSBjb3VsZCBjaG9vc2UgYW4gZXZlbnQgaW4gaGlzdG9yeSwgYSByZWNlbnQgbmV3cyBldmVudCB3aGljaCB0b29rIHBsYWNlIGluIHNldmVyYWwgbG9jYXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseS4KClRvIGJlZ2luIHdpdGgsIGdvIHRvIGh0dHBzOi8vc3RvcnltYXAua25pZ2h0bGFiLmNvbS8gYW5kIGNsaWNrIG9uICdNYWtlIGEgU3RvcnlNYXAnLgoKIVtdKGltYWdlcy9wYXN0ZS02OUMxMTVEQi5wbmcpCgpJdCB3aWxsIGFzayB5b3UgdG8gbG9nIGluIHdpdGggYSBHb29nbGUgYWNjb3VudCAtIHRoZXJlJ3Mgbm8gd2F5IGFyb3VuZCB0aGlzIHVuZm9ydHVuYXRlbHkuCgpPbmNlIGxvZ2dlZCBpbiwgY3JlYXRlIGEgbmV3IG1hcC4KCkJlZm9yZSB5b3UgYmVnaW4sIGNoZWNrIG91dCB0aGUgJ29wdGlvbnMnIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UuIE1vc3QgYXJlIHNlbGYtZXhwbGFuYXRvcnksIGJ1dCBvbmUgdG8gbm90ZSBpcyAnVHJlYXQgYXM6Jywgd2hpY2ggY2FuIGJlIGVpdGhlciAnaW1hZ2UnIG9yICdjYXJ0b2dyYXBoeScuIEZvciBvdXIgcHVycG9zZXMsIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB3aXRoICdpbWFnZScgc2VsZWN0ZWQsIHRoZXJlIHdpbGwgbm90IGJlIGEgbGluZSBkcmF3biBiZXR3ZWVuIHBvaW50cyBvbiB0aGUgbWFwLgoKVGhlIHN0YXJ0aW5nIHNsaWRlIGlzIGEgc3BlY2lhbCBzbGlkZSB3aGljaCB3aWxsIHNob3cgYWxsIHRoZSBwb2ludHMgZnJvbSB5b3VyIHN1YnNlcXVlbnQgc2xpZGVzLiBBZGQgYSBoZWFkbGluZSBhbmQgdGV4dCwgb3IgYW4gaW1hZ2Ugd2hpY2ggcmVwcmVzZW50cyB5b3VyIG1hcCBhcyBhIHdob2xlLiBVc2UgJ3ByZXZpZXcnIGF0IHRoZSB0b3Agb2YgdGhlIG1hcCB0byBzZWUgd2hhdCBpdCB3aWxsIGxvb2sgbGlrZSB0byB0aGUgdXNlci4KCk9uY2UgeW91J3JlIGhhcHB5LCBhZGQgYSBuZXcgc2xpZGUuIEFnYWluLCB5b3UgY2FuIGdpdmUgaXQgYSBuYW1lLCBhZGQgdGV4dCwgb3IgYWRkIGFuIGltYWdlIG9yIGV2ZW4gYSB5b3V0dWJlIHZpZGVvIGFzIGEgVVJMLiBOZXh0LCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgdGhlIHNsaWRlIHdpdGggYSBnZW9ncmFwaGljIGxvY2F0aW9uLiBUbyBkbyB0aGlzLCB1c2UgdGhlIHRleHQgYm94IGF0IHRoZSBib3R0b20gb2YgdGhlIG1hcC4gWW91IGNhbiBlaXRoZXIgYWRkIGNvb3JkaW5hdGVzIGRpcmVjdGx5ICh0aGVzZSBjYW4gYmUgZm91bmQgZWFzaWx5IHVzaW5nIEdvb2dsZSBtYXBzLCBhc2sgbWUgaWYgeW91J3JlIG5vdCBzdXJlKSwgb3IgeW91IGNhbiBzZWFyY2ggZm9yIGEgcGxhY2UuIFNlYXJjaCBmb3IgYSBsb2NhdGlvbiwgZm9yIGV4YW1wbGUgJ1BhcmlzJy4gQ2xpY2sgb24gdGhlIGNvcnJlY3Qgb25lLCBtYWtpbmcgc3VyZSB0aGF0IHlvdSBkb24ndCBzZWxlY3QgYW5vdGhlciBwbGFjZSB3aXRoIHRoZSBzYW1lIG5hbWUuIFRvIGFkZCBjb29yZGluYXRlcywgZW50ZXIgaW4gdGhlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRleHQgYm94LgoKQ29udGludWUgdW50aWwgeW91IGhhdmUgZmluaXNoZWQgd2l0aCB5b3VyIHNsaWRlcywgYW5kIGNoZWNrIGhvdyBpdCBsb29rcyB1c2luZyB0aGUgUHJldmlldy4KCk1ha2Ugc3VyZSB0byBzYXZlIHlvdXIgd29yaywgYW5kIHdoZW4geW91J3JlIGZpbmlzaGVkLCBjbGljayAnc2hhcmUnLiBDb3B5IHRoZSBVUkwgaW50byBhIC5wZGYsIGFsb25nIHdpdGggYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB5b3VyIG1hcCBhbmQgdGhlIG1vdGl2YXRpb24gYmVoaW5kIGl0LCBhbmQgdXBsb2FkIHRvIHRoZSByZWxldmFudCBhcmVhIG9uIEJyaWdodHNwYWNlLgoKIyMgQ3JlYXRlIGEgbWFwIHVzaW5nIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBSLgoKRm9yIHRoaXMsIHlvdSBuZWVkIHRvIHJ1biBhIGNvZGluZyBub3RlYm9vayB0aHJvdWdoIGEgc2VydmljZSBjYWxsZWQgTXlCaW5kZXIuIFRvIGxvYWQgdGhlIG5vdGVib29rLCBjbGljayB0aGUgYnV0dG9uIGJlbG93OgoKWyFbQmluZGVyXShodHRwczovL215YmluZGVyLm9yZy9iYWRnZV9sb2dvLnN2ZyldKGh0dHBzOi8vbXliaW5kZXIub3JnL3YyL2doL3lhbm4tcnlhbi9kaWdpdGFsX3N0b3J5dGVsbGluZy9IRUFEP3VybHBhdGg9cnN0dWRpbykKCk9uY2UgdGhpcyBsb2FkcyAoaXQgbWlnaHQgdGFrZSBhIGZldyBtaW51dGVzKSwgeW91J2xsIHNlZSBhIGNvZGluZyBub3RlYm9vay4gQmUgcHJlcGFyZWQgdG8gaGF2ZSBvbmUgb2YgdGhlIG90aGVyIHR1dG9yaWFscyBhcyBwbGFuIEIsIGFzIHNvbWV0aW1lcyB0aGlzIHNlcnZpY2UgZG9lc24ndCB3b3JrIQoKQW5vdGhlciBpbXBvcnRhbnQgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IEJpbmRlciBkb2Vzbid0IHNhdmUgeW91ciBkYXRhIC0gaW4gZmFjdCwgaWYgaXQgaXMgaWRsZSBmb3IgdGVuIG1pbnV0ZXMsIGl0IHdpbGwgYmUgZGVsZXRlZC4gU28gaWYgeW91IG1ha2UgbG90cyBvZiBjaGFuZ2VzIG9yIGlmIHlvdSB3YW50IHRvIGRvd25sb2FkIHlvdXIgb3V0cHV0LCBtYWtlIHN1cmUgeW91IGRvIHNvIGFzIHNvb24gYXMgcG9zc2libGUuCgpBZnRlciBhIHdhaXQsIHlvdSdsbCBiZSBncmVldGVkIHdpdGggYSBuZXcgaW50ZXJmYWNlLiBUbyBvcGVuIHRoZSBjb2RlIG5vdGVib29rIHdlJ3JlIGdvaW5nIHRvIHVzZSwgbG9vayBhdCB0aGUgZmlsZSBsaXN0cyBvbiB0aGUgYm90dG9tLXJpZ2h0IG9mIHRoZSBzY3JlZW4sIGFuZCBjbGljayBvbiB0aGUgZmlsZSAnZHJhd19vc21fbWFwLlJtZC4KCiFbXShpbWFnZXMvcGFzdGUtNTQ2MTZCRTIucG5nKQoKVGhlIG5vdGVib29rIGlzIGRpdmlkZWQgaW50byAnY2VsbHMnLiBFYWNoIGNlbGwgY29udGFpbnMgc29tZSBjb2RlLiBSdW4gdGhlIGNlbGwgYnkgY2xpY2tpbmcgdGhlIHNtYWxsIHRyaWFuZ2xlIG9uIHRoZSB0b3AgcmlnaHQuIFRoZSBjb2RlIHdpbGwgcnVuIGFuZCB0aGUgcmVzdWx0cyAoaWYgYW55KSB3aWxsIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgY2VsbC4KClRoZSBmaXJzdCBjZWxsIGxvYWRzIHNvbWUgbGlicmFyaWVzIChwYWNrYWdlcyBvZiBjb2RlKSBuZWVkZWQuCgpUaGUgbmV4dCBjZWxsIGRvd25sb2FkcyBkYXRhIGZyb20gT3BlbiBTdHJlZXQgTWFwLiBPcGVuIHN0cmVldCBtYXAgY29udGFpbnMgdGhvdXNhbmRzIG9mIHR5cGVzIG9mIGRhdGEsIGZyb20gcm9hZHMgYW5kIHJpdmVycyB0byBhbWVuaXRpZXMgc3VjaCBhcyBiYXJzIGFuZCByZXN0YXVyYW50cy4gWW91IGNhbiB1c2UgYSBjb2RpbmcgbGFuZ3VhZ2UgdG8gYWNjZXNzIHRoaXMgYW5kIGRyYXcgYSBtYXAuCgpIZXJlIEkgaGF2ZSBkb3dubG9hZGVkIGFsbCBwbGFjZXMgbWFya2VkIGFzIGEgcHViIHdpdGhpbiB0aGUgY2VudHJlIG9mIExlaWRlbi4gVG8gZG8gc28sIGZpcnN0IHdlIHNwZWNpZnkgYSAnYm91bmRpbmcgYm94Jywgd2hpY2ggdGVsbHMgdGhlIGNvZGUgdG8gb25seSBkb3dubG9hZCBkYXRhIGZyb20gd2l0aGluIGEgY2VydGFpbiBhcmVhIG9uIHRoZSBtYXAuIE5leHQsIHdlIHNwZWNpZnkgd2hhdCB0eXBlIG9mIGRhdGEsIGZpcnN0IGdlbmVyYWwgKCdhbWVuaXR5JykgYW5kIHRoZW4gc3BlY2lmaWMgKCdwdWInKS4gVGhlbiBkbyB0aGUgc2FtZSB0byBnZXQgcmVzaWRlbnRpYWwgc3RyZWV0cywgYW5kIGNhbmFscy4KCk5leHQgYXJlIGEgY291cGxlIG9mIHRyaWNrcyB0byBnZXQgdGhlIGFjdHVhbCBnZW9ncmFwaGljIGRhdGEgKHBvaW50cyBhbmQgbGluZXMpLCBidXQgaXQncyBub3Qgd29ydGggZ29pbmcgaW50byB0aGUgZGV0YWlscy4KCk9uY2UgeW91IHJ1biB0aGlzIGNlbGwsIGl0IHdpbGwgZG93bmxvYWQgYWxsIHRoZSByZWxldmFudCBkYXRhLgoKVGhlIGZpbmFsIGNlbGwgdHVybnMgaXQgaW50byBhIHNpbXBsZSBtYXAuIFdlIGFkZCBlYWNoIG9mIHRoZSBkYXRhIHBvaW50cyBhcyBsYXllcnMgdG8gdGhlIG1hcC4gV2hlbiB5b3UgcnVuIHRoZSBjZWxsLCB5b3UnbGwgc2VlIHRoZSBtYXAgdW5kZXJuZWF0aC4KCioqVGhlIGZ1biB0aGluZyBpcyB0aGF0IG5vdyB5b3UgY2FuIHRyeSBzd2FwcGluZyBpbiBkaWZmZXJlbnQgZGF0YSBwb2ludHMgdG8gZG93bmxvYWQsIGFuZCBldmVuIHRyeSB3aXRoIGFub3RoZXIgY2l0eS4gRm9yIHRoZSBmb3JtZXIsIHRoZSBmdWxsIGxpc3QgaXMgYXZhaWxhYmxlIGhlcmU6IGh0dHBzOi8vd2lraS5vcGVuc3RyZWV0bWFwLm9yZy93aWtpL01hcF9mZWF0dXJlcyoqCgpUbyB1c2UgYW5vdGhlciBjaXR5LCB5b3UnbGwgbmVlZCB0byBnZXQgdGhlIGNvcnJlY3QgY29vcmRpbmF0ZXMgZm9yIHRoZSBib3ggaXQgaXMgY29udGFpbmVkIHdpdGhpbi4gWW91IGNhbiB1c2UgYSBib3VuZGluZyBib3ggdG9vbCwgYW5kIHRoZW4gY29weSB0aGlzIGludG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNvbW1hbmQuICoqTm90ZSB0aGF0IGlmIHlvdSBjaG9vc2UgYSB2ZXJ5IGJpZyBhcmVhLCBpdCBtaWdodCBzdHJ1Z2dsZSB0byBkb3dubG9hZCB0aGUgZGF0YS4qKgoKT25jZSB5b3UgaGF2ZSBmaW5pc2hlZCB5b3VyIG1hcCwgc2F2ZSBpdCB1c2luZyAncmlnaHQgY2xpY2stXD4gc2F2ZSBpbWFnZSBhcycgaW4geW91ciBicm93c2VyLiBDb3B5IGludG8gYSAucGRmLCB3cml0ZSBhIDIwMC0zMDAgd29yZCBkZXNjcmlwdGlvbiBvZiB5b3VyIG1hcCBhbmQgd2hhdCBpdCBzaG93cywgYW5kIHVwbG9hZCB0byB0aGUgcmVsZXZhbnQgYXNzaWdubWVudCBvbiBCcmlnaHRzcGFjZS4K